home *** CD-ROM | disk | FTP | other *** search
/ START Magazine / START VOL 4 NO 1.st / POGOSRC.ARC / STINPUT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1985-11-20  |  2.9 KB  |  219 lines

  1. /* file to do keyboard.  It handles break checking and a 256 key buffer
  2.    internally.  Sadly very machine dependent. */
  3.  
  4. #define ST
  5.  
  6. #ifdef ST
  7. #include <osbind.h>
  8. #endif ST
  9.  
  10. #define KEYB 256
  11. #define BREAKKEY 11779
  12. #define DUMPKEY 8196
  13. extern int watchdog;
  14. static int keybuf[KEYB];
  15. static int keyread, keywrite;
  16. static int keycount;
  17.  
  18. extern int *aline;
  19. mouse_x()
  20. {
  21. return( aline[-301] );
  22. }
  23.  
  24. mouse_y()
  25. {
  26. return( aline[-300] );
  27. }
  28.  
  29. mouse_left()
  30. {
  31. return( (aline[-174] & 0x100) != 0);
  32. }
  33.  
  34. mouse_right()
  35. {
  36. return( (aline[-174] & 0x200) != 0);
  37. }
  38.  
  39.  
  40. time_peek()
  41. {
  42. return(*((long *)0x4ba));
  43. }
  44.  
  45.  
  46. get_clock()
  47. {
  48. register int time;
  49.  
  50. time = Supexec(time_peek);
  51. return(time);
  52. }
  53.  
  54. extern char _rjoy, _ljoy;
  55. extern int _bjoy;
  56. extern char findpacket();
  57.  
  58. struct kbdvecs
  59.     {
  60.     long  midivec, vkbderr, vmiderr, statvec, mousevec, clockvec;
  61.     char (*joyvec)(), *midisys, *ikbdsys;
  62.     };
  63. static char (*o)();
  64. static char in_joy;
  65. static struct kbdvecs *k;
  66. static char kb[] = { 0, 0 };
  67. static char mousedata[] = { 0,0,1,1};
  68.  
  69.  
  70. use_joy()
  71. {
  72. if (!in_joy)
  73.     {
  74.     k = (struct kbdvecs *)Kbdvbase();
  75.     o = k->joyvec;
  76.     k->joyvec = findpacket;
  77.     kb[0] = 0x14;    /* ikbd into joystick event mode */    
  78.     Ikbdws(0, kb);
  79.     in_joy = 1;
  80.     }
  81. }
  82.  
  83. use_mouse()
  84. {
  85. if (in_joy)
  86.     {
  87.     kb[0] = 0x1a;    /* ikbd into no joystick mode */    
  88.     Ikbdws(0, kb);
  89.     k->joyvec = o;
  90.     Initmous(1, &mousedata, k->mousevec);
  91.     in_joy = 0;
  92.     }
  93. }
  94.  
  95. joystick()
  96. {
  97. readjoy();
  98. return(_bjoy);
  99. }
  100.  
  101.  
  102. console()    /* machine dependent of course! */
  103. {
  104. #ifdef ST
  105. if (Cconis())
  106.     {
  107.     int w;
  108.     long l;
  109.  
  110.     l = Crawcin();
  111.     w = l>>8;
  112.     w += l;
  113.         return(w);
  114.     }
  115. else
  116.     return(0);
  117. #endif ST
  118. #ifdef TURBOC
  119. if (bioskey(1))    /* check for pending character */
  120.     {
  121.     return(bioskey(0));
  122.     }
  123. else
  124.     return(0)
  125. #endif TURBOC
  126. }
  127.  
  128. static buffer_write()
  129. {
  130. int key;
  131.  
  132. key = console();
  133. if (key && (key != BREAKKEY) && (key != DUMPKEY))
  134.     {
  135.     if (keycount < KEYB)
  136.         {
  137.         keybuf[keywrite++] = key;
  138.         if (keywrite >= KEYB)
  139.             keywrite = 0;
  140.         keycount++;
  141.         }
  142.     else
  143.         {
  144.         puts("Key buffer overflow!");
  145.         }
  146.     }
  147. return(key);
  148. }
  149.  
  150. rawkey()
  151. {
  152. int key;
  153.  
  154. if (keycount <= 0)
  155.     {
  156.     return(console());
  157.     }
  158. else
  159.     {
  160.     key = keybuf[keyread++];
  161.     if (keyread >= KEYB)
  162.         keyread = 0;
  163.     --keycount;
  164.     return(key);
  165.     }
  166. }
  167.  
  168.  
  169. inkey()
  170. {
  171. return(rawkey()&0xff);
  172. }
  173.  
  174.  
  175. waitkey()
  176. {
  177. int key;
  178.  
  179. while ((key = inkey()) == 0)
  180.     ;
  181. return(key);
  182. }
  183.  
  184. extern int user_abort;
  185.  
  186. #ifdef OLD
  187. /* Check to let user interrupt us from keyboard.  */
  188. check_abort()
  189. {
  190. if (buffer_write() == BREAKKEY)    /* check for control c */
  191.     {
  192.     user_abort = 1;
  193.     return(1);
  194.     }
  195. return(0);
  196. }
  197. #endif OLD
  198.  
  199. /* Check to let user interrupt us from keyboard.  */
  200. check_abort()
  201. {
  202. int c;
  203.  
  204. c = buffer_write();
  205. if (c == BREAKKEY)    /* check for control c */
  206.     {
  207.     watchdog = 0;
  208.     user_abort = 1;
  209.     }
  210. if (c == DUMPKEY)
  211.     {
  212.     watchdog = 0;
  213.     user_abort = 2;
  214.     puts("Dump key");
  215.     }
  216. }
  217.  
  218.  
  219.